import CryptoJS from 'crypto-js';

/**
 * 生成一个32位长度的随机字符串
 * @returns {string} 返回一个32位的随机字符串
 */
const generateRandomString = () => {
  // 定义字符集，包含大小写字母和数字
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  // 获取字符集的长度
  const charactersLength = characters.length;
  // 循环32次，每次从字符集中随机选取一个字符
  for (let i = 0; i < 32; i++) {
    // 将随机字符添加到结果字符串中
    result += characters.charAt(Math.floor(Math.random() * charactersLength));
  }
  // 返回生成的随机字符串
  return result;
};

/**
 * 随机生成一个AES加密密钥
 * 该函数使用CryptoJS库生成一个UTF-8编码的密钥
 * @returns {Object} 返回一个CryptoJS.lib.WordArray对象，作为AES密钥使用
 */
export const generateAesKey = () => {
  // 调用generateRandomString函数生成随机字符串
  // 然后使用CryptoJS的Utf8解析器将其转换为WordArray对象
  // WordArray是CryptoJS中用于存储二进制数据的数据结构
  return CryptoJS.enc.Utf8.parse(generateRandomString());
};

/**
 * 将CryptoJS的WordArray对象转换为Base64编码字符串
 * @param {CryptoJS.lib.WordArray} str - 需要被转换的CryptoJS WordArray对象
 * @returns {string} 返回Base64编码后的字符串
 */
export const encryptBase64 = (str: CryptoJS.lib.WordArray) => {
  // 使用CryptoJS的Base64编码方法将WordArray转换为Base64字符串
  return CryptoJS.enc.Base64.stringify(str); 
};


/**
 * 解码Base64编码的字符串
 * @param {string} str - Base64编码的字符串
 * @returns {Object} 返回CryptoJS的WordArray对象
 */
export const decryptBase64 = (str: string) => {  // 导出解密Base64的函数
  return CryptoJS.enc.Base64.parse(str);
};

/**
 * 使用AES密钥对请求数据进行加密操作
 * 
 * @param message 需要加密的数据
 * @param aesKey  AES加密密钥
 * @returns  加密后的数据
 */
export const encryptWithAes = (message: string, aesKey: CryptoJS.lib.WordArray) => {
  const encrypted = CryptoJS.AES.encrypt(message, aesKey, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
};


/**
 * 使用AES密钥对数据进行解密操作
 * 
 * @param message 需要解密的数据
 * @param aesKey  AES加密密钥
 * @returns  解密后的数据
 */
export const decryptWithAes = (message: string, aesKey: CryptoJS.lib.WordArray) => {
  const decrypted = CryptoJS.AES.decrypt(message, aesKey, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return decrypted.toString(CryptoJS.enc.Utf8);
};
